/**
 * 应用程序的根模块
 * 负责组织和配置整个应用的模块结构
 */
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_GUARD } from '@nestjs/core';
import Configuration from './config/configuration';

import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PrismaModule } from './modules/prisma/prisma.module';
import { RedisModule } from './modules/redis/redis.module';
import { SharedModule } from './modules/shared/shared.module';
import { UserModule } from './modules/user/user.module';
import { AuthModule } from './modules/auth/auth.module';
import { PermissionModule } from './modules/permission/permisson.module';
import { RoleModule } from './modules/role/role.module';
import { DepartmentModule } from './modules/department/department.module';

import { JwtAuthGuard } from 'src/common/guards/jwt.auth.guard';
import { PermissionAuthGuard } from 'src/common/guards/permissions.auth.guard';

@Module({
  imports: [
    /**
     * 配置模块
     * 1. isGlobal: true - 设置为全局模块，其他模块可直接注入
     * 2. envFilePath - 环境配置文件路径，支持多环境配置
     * 3. load - 加载自定义配置文件
     */
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: [`.env.${process.env.NODE_ENV}`, '.env'],
      load: [Configuration]
    }),

    /**
     * 核心功能模块
     * PrismaModule - 数据库ORM模块，处理数据库操作
     * RedisModule - Redis缓存模块，处理缓存
     * SharedModule - 共享模块，提供公共服务
     * UserModule - 用户管理模块
     * AuthModule - 认证模块，处理登录注册
     * PermissionModule - 权限模块
     * RoleModule - 角色模块
     * DepartmentModule - 部门模块
     */
    PrismaModule,
    RedisModule,
    SharedModule,
    UserModule,
    AuthModule,
    PermissionModule,
    RoleModule,
    DepartmentModule
  ],
  controllers: [AppController],
  providers: [
    AppService,
    /**
     * 全局守卫配置
     * 1. JwtAuthGuard - JWT认证守卫
     *    - 验证用户是否已登录
     *    - 验证token是否有效
     *
     * 2. PermissionAuthGuard - 权限验证守卫
     *    - 验证用户是否有权限访问特定接口
     *    - 配合 @Permission 装饰器使用
     */
    {
      provide: APP_GUARD,
      useClass: JwtAuthGuard
    },
    {
      provide: APP_GUARD,
      useClass: PermissionAuthGuard
    }
  ]
})
export class AppModule {}
